package com.algorithm.ch1.lzr.string;

/**
 * 实现 strStr() 函数。
 * <p>
 * 给定一个 haystack 字符串和一个 needle 字符串, 在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在，则返回  -1
 * <p>
 * 示例 1:
 * <p>
 * 输入: haystack = "hello", needle = "ll"
 * 输出: 2
 * 示例 2:
 * <p>
 * 输入: haystack = "aaaaa", needle = "bba"
 * 输出: -1
 * <p>
 * 当 needle 是空字符串时，我们应当返回什么值呢？这是一个在面试中很好的问题。
 * <p>
 * 对于本题而言, 当 needle 是空字符串时我们应当返回 0, 相当于实现String的indexOf方法
 *
 * @author lzr
 * @date 2018/8/16
 */
public class StrStr {

    public static void main(String[] args) {
        String haystack = "abb";
        String needle = "bbb";
        //int i = haystack.indexOf(needle);
        int i = strStr(haystack, needle);
        System.out.println(i);

    }

    /**
     * 实现strStr()行数
     * <p>
     * 1.需要遍历整个字符串的所有字符时, 适用String.toCharArray()的效率比String.chatAt()快
     * 2.单纯取某个字符时, 使用用String.chatAt()
     *
     * @param haystack
     * @param needle
     * @return
     */
    public static int strStr(String haystack, String needle) {
        if (needle.length() == 0) {
            return 0;
        }
        if (haystack.length() < needle.length()) {
            return -1;
        }
        int index = -1;
        char[] haystacks = haystack.toCharArray();
        char[] needles = needle.toCharArray();
        for (int i = 0; i < haystacks.length; i++) {
            if (haystacks[i] == needles[0]) {
                if (haystacks.length - i < needle.length()) {
                    return -1;
                }
                index = i;
                boolean flag = true;
                for (int j = 1; j < needles.length; j++) {
                    if (++i >= haystack.length()) {
                        return -1;
                    }
                    if (haystacks[i] != needles[j]) {
                        flag = false;
                        //初始化
                        i = index;
                        index = -1;
                        break;
                    }
                }
                if (flag) {
                    return index;
                }
            }
        }
        return index;
    }

}
